package algorithm.dynamicProgramming.leetcode;
//309. 最佳买卖股票时机含冷冻期
//714. 买卖股票的最佳时机含手续费
public class MaxProfit {
    public static void main(String[] args) {

    }
    //动态规划

    /**
     * 0.不持股且当天没卖出,定义其最大收益dp[i][0];
     * 1.持股,定义其最大收益dp[i][1]；
     * 2.不持股且当天卖出了，定义其最大收益dp[i][2]；
     * @param prices
     * @return
     */
    public static int maxProfit(int[] prices) {
        if (prices.length<=1){
            return 0;
        }
        int[][] f = new int[prices.length][3];
        f[0][0]=0;
        f[0][1]=-prices[0];
        f[0][2]=0;//可以理解成第0天买入又卖出，那么第0天就是“不持股且当天卖出了”这个状态了，
                  // 其收益为0，所以初始化为0是合理的
        for (int i =1;i<prices.length;i++){
            f[i][0] = Math.max(f[i-1][0],f[i-1][2]);
            f[i][1] = Math.max(f[i-1][0]-prices[i],f[i-1][1]);
            f[i][2] = f[i-1][1]+prices[i];
        }
        return Math.max(f[prices.length-1][0],f[prices.length-1][2]);
    }

    public static int maxProfit(int[] prices ,int fee) {
        int[][] f = new int[prices.length][2];
        f[0][0]=0;
        f[0][1]=-prices[0];
        for (int i =1;i<prices.length;i++){
            f[i][0] = Math.max(f[i-1][0],f[i-1][0]+prices[i]-fee);
            f[i][1] = Math.max(f[i-1][1],f[i-1][0]-prices[i]);
        }
        return f[prices.length-1][0];
    }
}
